package br.edu.unifei.cct720.trabalho04.utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
import java.util.Scanner;

/**
 * Classe responsavel por interagir com o arquivo 
 * de dados que contem as informacoes das formas
 * geometricas
 * 
 * @author fknappe
 *
 */
public class Arquivo extends File {
	
	//Declaracao de variaveis de instancia
	private Scanner scanner = null;
	private BufferedWriter stream = null;
	
	/**
	 * Construtor
	 * 
	 * @param String a
	 * @throws IllegalArgumentException
	 */
	public Arquivo(String a) throws IllegalArgumentException {
		super(a);
	}
	
	/**
	 * Metodo responsavel por abrir o arquivo para leitura
	 * 
	 * @return void
	 * @throws FileNotFoundException
	 */
	public void abrirArquivoParaLeitura() throws FileNotFoundException {
		this.scanner = new Scanner(this);
	}
	
	/**
	 * Metodo responsavel por abrir o arquivo para escrita
	 * 
	 * @return void
	 * @throws IOException
	 */
	public void abrirArquivoParaEscrita() throws IOException {
		this.stream = new BufferedWriter(new FileWriter(this.getAbsolutePath().toString()));
	}
	
	/**
	 * Metodo responsavel por fechar o arquivo
	 * 
	 * @return void
	 * @throws IOException, NullPointerException
	 */
	public void fecharArquivo() throws IOException, NullPointerException {
		if(this.scanner != null) this.scanner.close();
		if(this.stream != null) this.stream.close();
	}
	
	/**
	 * Metodo que retorna os valores contidos no arquivo
	 * 
	 * @return int
	 * @throws InputMismatchException, NoSuchElementException, IllegalStateException
	 */
	public int getProximoValorInteiro() throws InputMismatchException, NoSuchElementException, IllegalStateException {
		return this.scanner.nextInt();
	}
	
	public double getProximoValorPontoFlutuante() throws InputMismatchException, NoSuchElementException, IllegalStateException {
		return this.scanner.nextFloat();
	}
	
	/**
	 * Metodo responsavel pela escrita de dados no arquivo
	 * 
	 * @param txt
	 * 
	 * @return void
	 */
	public void escrita(String txt) throws IOException {
		this.stream.write(txt);
	}
	
	public void escrita(int v) throws IOException {
		this.stream.write(v);
	}
	
	/**
	 * Metodo responavel por criar uma nova linha no arquivo
	 * 
	 * @return void
	 * @throws IOException
	 */
	public void novaLinha() throws IOException {
		this.stream.newLine();
	}
}
